package tech.veedo.munchkin.beans.backend;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import tech.veedo.munchkin.beans.basic.Base;
import tech.veedo.munchkin.constants.UpgradeTactic;

import java.util.HashMap;
import java.util.List;

/**
 * 真正对应每个机构的工作流，包含有N个{@link Node},
 * 由Workflow和机构映射生成，如果是公有Mapping(publicM = true)，
 * 则任何人都可以发起流程审批，否则只有{@link Beginner}才可以。
 *
 */
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "机构使用的实体工作流", description = "由顶级工作流和机构映射而成，是机构使用的具体工作流实体类")
@Data
@Accessors(chain = true)
@TableName("MUNC_MAPPING")
public class Mapping extends Base<Mapping> {

    @ApiModelProperty("版本号")
    @Version
    private Long version;

    @ApiModelProperty("实体工作流名称")
    private String name;

    @ApiModelProperty("父级顶级工作流标识")
    @TableField("workflow_id")
    private Long workflowID;

    @ApiModelProperty("机构编码")
    @TableField("org_code")
    private String orgCode;

    @ApiModelProperty("机构名称")
    @TableField("org_name")
    private String orgName;

    @ApiModelProperty("公共工作流标识")
    @TableField("publik")
    private boolean publik;

    @ApiModelProperty("是否使用中流程")
    @TableField("in_using")
    private boolean inUsing;

    @ApiModelProperty("是否挂接另一个工作流")
    private boolean hook;

    @ApiModelProperty("挂接的实体工作流id")
    @TableField("hook_mapping_id")
    private Long hookMappingID;

    @ApiModelProperty("更新策略")
    private UpgradeTactic tactic;

    @ApiModelProperty("工作流节点列表")
    private transient List<Node> nodes;

    public Integer hash() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", this.name);
        map.put("public", this.publik);
        map.put("use", this.inUsing);
        map.put("hook", this.hook);
        map.put("hookMID", this.hookMappingID);
        return map.hashCode();
    }

}
